<article>
    <h1><?php echo $GLOBALS["title"] ?></h1>
    <p>MySQL增强版扩展,MySQLi 函数允许您访问 MySQL 数据库服务器。MySQLi 扩展被设计用于 MySQL 4.1.13 版本或更新的版本,MySQLi提供面向过程和面向对象两种接口</p>
    <h3>查看是否支持</h3>
    <p>通过<code>phpinfo()</code>查看是否成功加载</p>
    <img src="__PUBLIC__/images/mysqli.png" alt="" width="100%">
   	<p><code>注意：</code>如果没加载，可以去php.ini看是否开启该扩展,如果前面有分号去掉</p>
   	<img src="__PUBLIC__/images/mysqli_ext.png" alt="" width="100%">
   	<code></code>
   	<p><code>注意：</code>如果没有该扩展，百度"php mysqli扩展安装"，有很多场景下的解决方案。</p>
   	<h2><a>操作mysql流程</a></h2>
    <ol>
    	<li>建立mysql联接</li><p></p>
    	<li>发送查询SQL</li><p></p>
    	<li>从结果集中取出数据</li><p></p>
    	<li>释放资源</li><p></p>
    	<li>关闭数据库连接</li>
    </ol>
    <h2><a>面向对象风格使用mysqli</a></h2>
    <h3>函数语法</h3>
    <h5>实例mysqli对象，建立连接</h5>
    <code>$mysqli = @new mysqli("localhost", "my_user", "my_password", "world");</code>
    <p>返回创建后的数据链接对象</p>
    <h5>错误信息反馈（对象属性）</h5>
    <ul>
    	<li><code><?php echo htmlspecialchars('int $mysqli->connect_errno'); ?></code>返回链接错误代码</li>
    	<li><code><?php echo htmlspecialchars('string $mysqli->connect_error;') ?></code>返回链接错误文本</li>
    	<li><code><?php echo htmlspecialchars('int $mysqli->errno'); ?></code>返回最近函数调用的错误代码</li>
    	<li><code><?php echo htmlspecialchars('string $mysqli->error;') ?></code>返回最近函数调用的错误文本</li>
    </ul>
    <h5>发送查询</h5>
    <code>mixed $mysqli->query (string $query )</code>
    <p>对数据库执行一次查询</p>
    <h5>通过结果集取数据</h5>
    <code>mysqli_result::fetch_row()</code>
    <p>取得一行以索引数组形式返回的数据</p>
   	<code>mysqli_result::fetch_assoc()</code>
    <p>取得一行以关联数组形式返回的数据</p>
    <code>mysqli_result::fetch_object()</code>
    <p>取得一行以对象形式返回的数据</p>
    <code>mysqli_result::fetch_array($type) 参数为返回结果的类型</code>
    <p>参数：（<code>MYSQLI_ASSOC</code> 返回关联数组  <code>MYSQLI_NUM</code> 返回索引数组  <code>MYSQLI_BOTH</code> 返回关联不索引数组）
</p>
	<h5>释放结果内存</h5>
	<code>mysqli_result::free()</code>
	<p>从内存中释放结果集</p>
	<h5>关闭链接</h5>
    <code>mysqli::close()</code>
    <p>函数关闭非持久的 MySQL 连接。</p>
    <h5>结果集数量</h5>
    <code>mysqli_result::num_rows</code>
    <h5>自增ID</h5>
    <code><?php echo htmlspecialchars('mixed $mysqli->insert_id') ?></code>
    <h5>受影响数量</h5>
    <code>int $mysqli->affected_rows;</code>
	<h2><a>MySQLi_STMT类（预准备）</a></h2>
	<h3>预准备语句</h3>
	<p>每一条SQL的执行过程包括分析、编译、优化查询等操作，如果只是  SQL的参数不同而其他项一样，那么可以想象，数据库做了很多次重  复的分析、编译、优化操作，显然这种执行方式会降低效率。如果使  用预准备方式操作，这种分析、编译、优化的操作只需要执行一次，  以后只是参数的不同，这样效率会更快</p>
	<p>先将SQL提交到MySQL服务器，预先解析，事后可以只传递参数到  MySQL服务器，减少解析次数、提高MySQL处理效率。</p>
	<p>同时由于参数不是随着SQL一起发送到服务器端，所以屏蔽了SQL
注入等等的危险操作</p>
	<h3>绑定参数</h3>
	<p>可以事先在预先解析的SQL上指定占位符？号来为后面传递的值预  留空间位，可以把?想象成函数的形参这样更好理解</p>
	<h3>常用函数语法</h3>
	<h5>产生预准备对象</h5>
	<code>mysqli_stmt mysqli::stmt_init ( void )</code>
	<p>初始化一条语句并返回一个用于mysqli_stmt_prepare(调用)的对象</p>
	<code>mysqli_stmt mysqli::prepare ( $sql )</code>
	<h5>提交一个要执行的sql</h5>
	<code>mixed mysqli_stmt::prepare ( string $query )</code>
	<h5>绑定参数</h5>
	<code><?php echo htmlspecialchars('bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )') ?></code>
	<h5>执行预准备查询</h5>
	<code>bool mysqli_stmt::execute ( void )</code>
	<h5>受影响数量</h5>
	<code><?php echo htmlspecialchars('int $mysqli_stmt->affected_rows') ?></code>
	<h5>错误代码</h5>
	<code><?php echo htmlspecialchars('int $mysqli_stmt->errno') ?></code>
	<h5>错误信息</h5>
	<code><?php echo htmlspecialchars('int $mysqli_stmt->errno') ?></code>
	<h5>最后插入的ID</h5>
	<code><?php echo htmlspecialchars('int $mysqli_stmt->insert_id') ?></code>
	<h3>完整实例</h3>
	<pre><code><?php echo htmlspecialchars('
<?php
$mysqli = new mysqli(\'localhost\', \'my_user\', \'my_password\', \'world\');

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
//?占位符
$stmt->bind_param(\'sssd\', $code, $language, $official, $percent);
//sssd,前三个是字符串，最后一个是小数
$code = \'DEU\';
$language = \'Bavarian\';
$official = "F";
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf("%d Row inserted.\n", $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language=\'Bavarian\'");
printf("%d Row deleted.\n", $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>
') ?></code></pre>
	<h3>绑定参数类型参考</h3>
	<table class="doctable table">
	    <caption><strong>Type specification chars</strong></caption>
	    
	     <thead>
	      <tr>
	       <th>Character</th>
	       <th>Description</th>
	      </tr>

	     </thead>

	     <tbody class="tbody">
	      <tr>
	       <td>i</td>
	       <td>corresponding variable has type integer</td>
	      </tr>

	      <tr>
	       <td>d</td>
	       <td>corresponding variable has type double</td>
	      </tr>

	      <tr>
	       <td>s</td>
	       <td>corresponding variable has type string</td>
	      </tr>

	      <tr>
	       <td>b</td>
	       <td>corresponding variable is a blob and will be sent in packets</td>
	      </tr>

	     </tbody>
	    
	   </table>

</article>